﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using Entidades.Sistema;
using Entidades.Seguridad;
using Entidades.Sistema.Base;
using Entidades.Sistema.Venta;
using Mapping.Sistema.Venta;

namespace Mapping.Sistema.Base
{
    public static class MappingEmpleado
    {
        public static List<Empleado> ConsultarEmpleados()
        {
            try
            {
                SqlCommand cmdEmpleados = new SqlCommand();
                cmdEmpleados.CommandText = "sp_Consultarempleado";
                cmdEmpleados.CommandType = System.Data.CommandType.StoredProcedure;
                Servicios.Conexion.ObtenerInstancia().Conectar("Sistema");
                cmdEmpleados.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
                SqlDataReader drEmpleados = cmdEmpleados.ExecuteReader();

                List<Empleado> ColEmpleados = new List<Empleado>();

                while (drEmpleados.Read())
                {
                    Empleado oEmpleado = new Empleado();
                    oEmpleado.IdEmpleado = Convert.ToInt16(drEmpleados["Id_Empleado"]);
                    oEmpleado.IdUsuario = drEmpleados["id_Usuario"].ToString();
                    oEmpleado.NombreApellido = drEmpleados["Nombre"].ToString();
                    oEmpleado.Cargo.IdCargo = Convert.ToInt16(drEmpleados["id_Cargo"]);
                    oEmpleado.IdUsuario = drEmpleados["NombreUsuario"].ToString();
                    oEmpleado.Estado = Convert.ToBoolean(drEmpleados["Estado"]);
                    oEmpleado.Email = drEmpleados["email"].ToString();
                    oEmpleado.Clave = drEmpleados["Clave"].ToString();
                    oEmpleado.Cargo = Mapping.Sistema.Base.MappingCargo.ConsultarCargoPorClave(oEmpleado.Cargo.IdCargo);

                    SqlCommand cmdEmpleadoProducto = new SqlCommand();
                    cmdEmpleadoProducto.CommandText = "sp_ConsultarEmpleadoProducto";
                    cmdEmpleadoProducto.CommandType = System.Data.CommandType.StoredProcedure;
                    cmdEmpleadoProducto.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
                    cmdEmpleadoProducto.Parameters.Add("@IdEmpleado", System.Data.SqlDbType.Int).Value = oEmpleado.IdEmpleado;
                    SqlDataReader drEmpleadoProducto = cmdEmpleadoProducto.ExecuteReader();

                    while (drEmpleadoProducto.Read())
                    {
                        Producto oProducto = new Producto();
                        oProducto = Mapping.Sistema.Venta.MappingProductos.ConsultarProductoPorClave(Convert.ToInt16(drEmpleadoProducto["Id_Producto"]));
                        oEmpleado.AgregarProducto(oProducto);
                    }
       
                    ColEmpleados.Add(oEmpleado);
                }
                Servicios.Conexion.ObtenerInstancia().Desconectar("Sistema");
                return ColEmpleados;
            }
            catch (Exception ex)
            {
                Servicios.Conexion.ObtenerInstancia().Desconectar("Sistema");
                throw (ex);
            }
        }

        public static Empleado ConsultarEmpleadoLeerPorClave(int idEmpleado)
         {
             try
             {
                SqlCommand cmdEmpleados = new SqlCommand();
                cmdEmpleados.CommandText = "sp_ConsultarEmpleadoLeerPorClave";
                cmdEmpleados.CommandType = System.Data.CommandType.StoredProcedure;
                cmdEmpleados.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
                cmdEmpleados.Parameters.Add("@Id_Empleado", System.Data.SqlDbType.Int).Value = idEmpleado;
                SqlDataReader drEmpleados = cmdEmpleados.ExecuteReader();
                 
                Empleado oEmpleado = new Empleado();

                while (drEmpleados.Read())
                {
                    oEmpleado.IdEmpleado = Convert.ToInt16(drEmpleados["Id_Empleado"]);
                    oEmpleado.IdUsuario = drEmpleados["id_Usuario"].ToString();
                    oEmpleado.NombreApellido = drEmpleados["Nombre"].ToString();
                    oEmpleado.Cargo.IdCargo = Convert.ToInt16(drEmpleados["id_Cargo"]);
                    oEmpleado.IdUsuario = drEmpleados["NombreUsuario"].ToString();
                    oEmpleado.Estado = Convert.ToBoolean(drEmpleados["Estado"]);
                    oEmpleado.Email = drEmpleados["email"].ToString();
                    oEmpleado.Clave = drEmpleados["Clave"].ToString();
                    oEmpleado.Cargo = Mapping.Sistema.Base.MappingCargo.ConsultarCargoPorClave(oEmpleado.Cargo.IdCargo);

                    //SqlCommand cmdEmpleadoProducto = new SqlCommand();
                    //cmdEmpleadoProducto.CommandText = "sp_ConsultarEmpleadoProducto";
                    //cmdEmpleadoProducto.CommandType = System.Data.CommandType.StoredProcedure;
                    //cmdEmpleadoProducto.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
                    //cmdEmpleadoProducto.Parameters.Add("@IdEmpleado", System.Data.SqlDbType.Int).Value = oEmpleado.IdEmpleado;
                    //SqlDataReader drEmpleadoProducto = cmdEmpleadoProducto.ExecuteReader();

                    //while (drEmpleadoProducto.Read())
                    //{
                    //    Producto oProducto = new Producto();
                    //    oProducto = Mapping.Sistema.Venta.MappingProductos.ConsultarProductoPorClave(Convert.ToInt16(drEmpleadoProducto["Id_Producto"]));
                    //    oEmpleado.AgregarProducto(oProducto);
                    //}
                }                
                 
                return oEmpleado;
             }
             catch (Exception ex)
             {
                 Servicios.Conexion.ObtenerInstancia().Desconectar("Sistema");
                 throw (ex);
             }
        }

        public static bool AgregarEmpleado(Empleado oEmpleado)
        {

            try
              {
                SqlCommand cmdEmpleados = new SqlCommand();      
                cmdEmpleados.CommandText = "sp_AgregarEmpleado";
                cmdEmpleados.CommandType = System.Data.CommandType.StoredProcedure;
                Servicios.Conexion.ObtenerInstancia().Conectar("Sistema");
                cmdEmpleados.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
                cmdEmpleados.Parameters.Add("@id_Usuario", System.Data.SqlDbType.VarChar).Value = oEmpleado.IdUsuario;
                cmdEmpleados.Parameters.Add("@Nombre", System.Data.SqlDbType.VarChar).Value = oEmpleado.NombreApellido;
                cmdEmpleados.Parameters.Add("@Id_Cargo", System.Data.SqlDbType.Int).Value = oEmpleado.Cargo.IdCargo;
                cmdEmpleados.ExecuteNonQuery();
                Servicios.Conexion.ObtenerInstancia().Desconectar("Sistema");

            SqlCommand cmdUsuarios = new SqlCommand();
            cmdUsuarios.CommandText = "sp_AgregarUsuario";
            cmdUsuarios.CommandType = System.Data.CommandType.StoredProcedure;
            Servicios.Conexion.ObtenerInstancia().Conectar("Seguridad");
            cmdUsuarios.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdUsuarios.Parameters.Add("@IdUsuario", System.Data.SqlDbType.VarChar).Value = oEmpleado.IdUsuario;
            cmdUsuarios.Parameters.Add("@Apellido", System.Data.SqlDbType.VarChar).Value = oEmpleado.NombreApellido;
            cmdUsuarios.Parameters.Add("@Estado", System.Data.SqlDbType.Bit).Value = oEmpleado.Estado;
            cmdUsuarios.Parameters.Add("@Clave", System.Data.SqlDbType.VarChar).Value = oEmpleado.Clave;
            cmdUsuarios.Parameters.Add("@Email", System.Data.SqlDbType.VarChar).Value = oEmpleado.Email;
            cmdUsuarios.ExecuteNonQuery();
            Servicios.Conexion.ObtenerInstancia().Desconectar("Seguridad");

            return true;

                 }
            catch
                {
                    return false;
                }

        }

        public static bool ModificarEmpleado(Empleado oEmpleado)
        {
            

            SqlCommand cmdUsuario = new SqlCommand();
            cmdUsuario.CommandText = "sp_ModificarUsuario";
            cmdUsuario.CommandType = System.Data.CommandType.StoredProcedure;
            Servicios.Conexion.ObtenerInstancia().Conectar("Seguridad");            
            cmdUsuario.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdUsuario.Parameters.Add("@IdUsuario", System.Data.SqlDbType.VarChar).Value = oEmpleado.IdUsuario;
            cmdUsuario.Parameters.Add("@Apellido", System.Data.SqlDbType.VarChar).Value = oEmpleado.NombreApellido;
            cmdUsuario.Parameters.Add("@Estado", System.Data.SqlDbType.Bit).Value = oEmpleado.Estado;
            cmdUsuario.Parameters.Add("@Clave", System.Data.SqlDbType.VarChar).Value = oEmpleado.Clave;
            cmdUsuario.Parameters.Add("@Email", System.Data.SqlDbType.VarChar).Value = oEmpleado.Email;
            cmdUsuario.ExecuteNonQuery();
            Servicios.Conexion.ObtenerInstancia().Desconectar("Seguridad");

            SqlCommand cmdEmpleados = new SqlCommand();
            cmdEmpleados.CommandText = "sp_ModificarEmpleado";
            cmdEmpleados.CommandType = System.Data.CommandType.StoredProcedure;
            Servicios.Conexion.ObtenerInstancia().Conectar("Sistema");
            cmdEmpleados.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdEmpleados.Parameters.Add("@id_Usuario", System.Data.SqlDbType.VarChar).Value = oEmpleado.IdUsuario;
            cmdEmpleados.Parameters.Add("@Nombre", System.Data.SqlDbType.VarChar).Value = oEmpleado.NombreApellido;
            //cmdEmpleados.Parameters.Add("@Id_Cargo", System.Data.SqlDbType.Bit).Value = oEmpleado.Cargo.Nombre;
            cmdEmpleados.Parameters.Add("@Id_Cargo", System.Data.SqlDbType.Int).Value = oEmpleado.Cargo.IdCargo;
            cmdEmpleados.ExecuteNonQuery();

            SqlCommand cmdEmpleadosProductoEliminar = new SqlCommand();
            cmdEmpleadosProductoEliminar.CommandText = "sp_EliminarEmpleadoProducto";
            cmdEmpleadosProductoEliminar.CommandType = System.Data.CommandType.StoredProcedure;
            cmdEmpleadosProductoEliminar.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdEmpleadosProductoEliminar.Parameters.Add("@Id_Empleado", System.Data.SqlDbType.Int).Value = oEmpleado.IdEmpleado;
            cmdEmpleadosProductoEliminar.ExecuteNonQuery();

            foreach (Producto pro in oEmpleado.Productos)
            {
                AgregarEmpleadoProducto(oEmpleado.IdEmpleado, pro);
            }


            Servicios.Conexion.ObtenerInstancia().Desconectar("Sistema");

            return true;
        }
        public static bool EliminarEmpleado(Empleado oEmpleado)
        {
             try
              {
            SqlCommand cmdGruposUsuarios = new SqlCommand();
            cmdGruposUsuarios.CommandText = "sp_EliminarGrupoUsuario";
            cmdGruposUsuarios.CommandType = System.Data.CommandType.StoredProcedure;
            Servicios.Conexion.ObtenerInstancia().Conectar("Seguridad");
            Servicios.Conexion.ObtenerInstancia().Conectar("Sistema");
            cmdGruposUsuarios.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdGruposUsuarios.Parameters.Add("@IdUsuario", System.Data.SqlDbType.VarChar).Value = oEmpleado.IdUsuario;
            cmdGruposUsuarios.ExecuteNonQuery();


            SqlCommand cmdUsuarios = new SqlCommand();
            cmdUsuarios.CommandText = "sp_EliminarUsuario";
            cmdUsuarios.CommandType = System.Data.CommandType.StoredProcedure;
            cmdUsuarios.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdUsuarios.Parameters.Add("@IdUsuario", System.Data.SqlDbType.VarChar).Value = oEmpleado.IdUsuario;
            cmdUsuarios.ExecuteNonQuery();
            Servicios.Conexion.ObtenerInstancia().Desconectar("Seguridad");

            SqlCommand cmdEmpleados = new SqlCommand();

            cmdEmpleados.CommandText = "sp_EliminarEmpleado";
            cmdEmpleados.CommandType = System.Data.CommandType.StoredProcedure;
            Servicios.Conexion.ObtenerInstancia().Conectar("Sistema");
            cmdEmpleados.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdEmpleados.Parameters.Add("@id_Usuario", System.Data.SqlDbType.VarChar).Value = oEmpleado.IdUsuario;
            cmdEmpleados.ExecuteNonQuery();
            Servicios.Conexion.ObtenerInstancia().Desconectar("Sistema");

            return true;

              }
             catch
             {
                 return false;
             }
        }

        public static bool AgregarEmpleadoProducto(int idEmpleado, Producto oProducto)
        {

            SqlCommand cmdEmpleadoProducto = new SqlCommand();
            cmdEmpleadoProducto.CommandText = "sp_AgregarEmpleadoProducto";
            cmdEmpleadoProducto.CommandType = System.Data.CommandType.StoredProcedure;
            cmdEmpleadoProducto.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdEmpleadoProducto.Parameters.Add("@Id_Empleado", System.Data.SqlDbType.Int).Value = idEmpleado;
            cmdEmpleadoProducto.Parameters.Add("@Id_Producto", System.Data.SqlDbType.Int).Value = oProducto.IdProducto;
            cmdEmpleadoProducto.ExecuteNonQuery();

            return true;
        }

    }
}
